#coding=utf-8

# 簡單實用的網路工具包！

import os
import urllib.request
import urllib.parse
import tempfile

def rgbToHTMLColor(rgb):
    ''' 把rgb tuple 轉換成 #RRGGBB
    這是從網路上找的，很神奇的碼，不過短又有效'''
    #hexcolor = '#%02x%02x%02x' % rgb
    return '#{:02X}{:02X}{:02X}'.format(*rgb)

def downloadWebResourse(url, saveDirPath = None, timeout = 10):
    '''抓取url的資料，使用%反轉後的同樣檔名，存到saveDirPath的位置
    如果 saveDirPath 未輸入則使用系統暫存位置
    timeout 單位為秒（浮點數），超時則視為失敗
    成功則回傳檔案完整路徑，失敗回傳None'''
    #路徑不存在的話，取得暫存路徑
    if saveDirPath is None:
        saveDirPath = tempfile.gettempdir()
    #分析並變更url模式
    p = urllib.parse.urlparse(url)
    #針對不同的url中有沒有%，做不同的處理
    #產生下載用的quoteUrl和命名用的fileName
    if ('%' in p.path) or ('%' in p.netloc):
        #有%表示url是經過編碼的，可以直接下載，但是作為檔名會亂碼
        quoteUrl = url
        uqPath = urllib.parse.unquote(p.path)
        fileName = os.path.basename(uqPath)
    else: #沒有%表示需要將路徑編碼後才能下載，作為檔名倒是可以直接使用
        qNetloc = urllib.parse.quote(p.netloc)
        qPath = urllib.parse.quote(p.path)
        quoteUrl = urllib.parse.urlunparse(
                [p.scheme, qNetloc, qPath, p.params, p.query, p.fragment])
        fileName = os.path.basename(p.path)
    #計算儲存檔案路徑
    saveFilePath = os.path.join(saveDirPath, fileName)
    #抓取資料
    try:
        obj = urllib.request.urlopen(quoteUrl , timeout = timeout)
    except urllib.error.URLError:
        return None
    #保存資料到指定位置
    with open(saveFilePath, mode = 'wb') as f:
        f.write(obj.read())
    #全部工作完成
    return saveFilePath
